javascript oop、instanceof 和基类
全部标签 我想使用成员函数指针调用虚函数的基类实现。classBase{public:virtualvoidfunc(){cout*fp)();//Derived::funcwillbecalled.//InmyapplicationIstorethepointerforlateruse,//soIcan'tsimplydoBase::func().}};在上面的代码中,func的派生类实现将从callFunc中调用。有没有办法可以保存指向Base::func的成员函数指针,或者我必须以某种方式使用using?在我的实际应用程序中,我使用boost::bind在callFunc中创建了一个boo
考虑这个例子:#includeclassA{public:virtualvoidf();};voidA::f(){std::coutA::f()实现是C类“隐藏”的,它为f()提供了自己的实现-有效地使A::f()或多或少毫无意义。我认为这种类层次结构设计没有什么值(value),但我的问题是这是一个有效的C++还是只是“有效”(例如未定义的行为)? 最佳答案 标准明确允许和支持(例如,参见this在线C++标准草案),因此显然不是未定义的行为:10.4Abstractclasses5[Note:Anabstractclasscan
考虑这个例子:#includeclassA{public:virtualvoidf();};voidA::f(){std::coutA::f()实现是C类“隐藏”的,它为f()提供了自己的实现-有效地使A::f()或多或少毫无意义。我认为这种类层次结构设计没有什么值(value),但我的问题是这是一个有效的C++还是只是“有效”(例如未定义的行为)? 最佳答案 标准明确允许和支持(例如,参见this在线C++标准草案),因此显然不是未定义的行为:10.4Abstractclasses5[Note:Anabstractclasscan
据我所知,不能调用基类的构造函数。我知道的唯一方法是:MyClass::MyClass(/*args*/):Base(/*args*/){//...}但这会在开始时调用构造函数。有没有办法在构造函数的其他地方调用它?像这样的:MyClass::MyClass(/*args*/){//...instructionsBase::Base(/*args*/);//...other_instructions}据此Whataretherulesforcallingthesuperclassconstructor?问题我明白没有办法,但我读了here我猜这是可能的,但如果我尝试,我会得到:erro
据我所知,不能调用基类的构造函数。我知道的唯一方法是:MyClass::MyClass(/*args*/):Base(/*args*/){//...}但这会在开始时调用构造函数。有没有办法在构造函数的其他地方调用它?像这样的:MyClass::MyClass(/*args*/){//...instructionsBase::Base(/*args*/);//...other_instructions}据此Whataretherulesforcallingthesuperclassconstructor?问题我明白没有办法,但我读了here我猜这是可能的,但如果我尝试,我会得到:erro
以下代码无法编译:classA{public:A(int){}};classB:virtualpublicA{public:B():A(0){}};//mostderivedclassclassC:publicB{public:C(){}//wrong!!!};如果我在C的构造函数初始化列表中调用A的构造函数,即://mostderivedclassclassC:publicB{public:C():A(0){}//OK!!!};确实有效。显然,原因是因为虚拟基类必须始终由大多数派生类构造。我不明白这个限制背后的原因。 最佳答案 因
以下代码无法编译:classA{public:A(int){}};classB:virtualpublicA{public:B():A(0){}};//mostderivedclassclassC:publicB{public:C(){}//wrong!!!};如果我在C的构造函数初始化列表中调用A的构造函数,即://mostderivedclassclassC:publicB{public:C():A(0){}//OK!!!};确实有效。显然,原因是因为虚拟基类必须始终由大多数派生类构造。我不明白这个限制背后的原因。 最佳答案 因
在以下程序中,a当B虚拟地从A派生并且复制C(不是B)的实例时,不会复制成员变量。#includeclassA{public:A(){a=0;printf("A()\n");}inta;};classB:virtualpublicA{};classC:publicB{public:C(){}C(constC&from):B(from){}};templatevoidtest(){Tt1;t1.a=3;printf("pre-copy\n");Tt2(t1);printf("post-copy\n");printf("t1.a=%d\n",t1.a);printf("t2.a=%d\n"
在以下程序中,a当B虚拟地从A派生并且复制C(不是B)的实例时,不会复制成员变量。#includeclassA{public:A(){a=0;printf("A()\n");}inta;};classB:virtualpublicA{};classC:publicB{public:C(){}C(constC&from):B(from){}};templatevoidtest(){Tt1;t1.a=3;printf("pre-copy\n");Tt2(t1);printf("post-copy\n");printf("t1.a=%d\n",t1.a);printf("t2.a=%d\n"
我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon